//
//  SetterAndGetterTests.swift
//  SetterAndGetterTests
//
//  Created by meitianhui2 on 2018/1/12.
//  Copyright © 2018年 DeLongYang. All rights reserved.
//

import XCTest

class TestModel: NSObject {
    var testModelName:String = ""
    var testModelAge:Int = 20
}

class SetterAndGetterTests: XCTestCase {
    
    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
        
    }
    
    // 测试某个 方法
    var a:Int = 0;
    var b:Int = 0;
    
    //  所以仅仅想获取 原来的值 其实意义不大 通常是写别的
    var c:Int {
        get{
            // 这里 不论是 c 还是 self.c 都会造成 crash  原因是方法的死循环
            // 而且 不能像 OC 中 写上 _c
            return 1
        }
        
        set{
            // 我们测试 写上 self.c = newValue 和 不写 都会造成 crash
            // 而且 不能像 OC 中 写上 _c
            a = newValue
            print("Recived new value", newValue, " and stored into 'A' ")
        }
    }
    
    // 使用了 外部的一个变量来重写了这个 方法
    var _tittle:String?
    var tittle: String?{
        
        set{
            
            _tittle=newValue
        }
        get{
            return _tittle
        }
    }
    
    // 如果只重写 get 方法,默认为 readOnly
    var age:Int?{
        return 20
    }
    
    // swift 中有储值属性和计算属性，一般 我们只是给计算属性添加 get set 方法
    //  在set、get方法中有相应的计算
    var num:Int = 0
    var ddd:Int {
        get{
            return num+11
        }
        
        set{
            num = num + newValue
        }
    }
    
    // 存储属性： 就是存储一个变量 或 常量  懒加载也属于存储型属性 类似于OC中的方法
    let aaa = "aaa"
    lazy var ccc:[TestModel] = {
        let testModel = TestModel()
        var arr = [TestModel]()
        for _ in 0...99{
            arr.append(testModel)
        }
        //
        return arr
    }()
    
    // swift 中使用了willset 和 didSet 这连个特性 来见识属性的除初始化之外的 属性值变化
    // 和 OC 比较，我们可以在didSet 里面执行一些改变UI的操作
    var newAge:String?{
        
        willSet{
            //
            print("===========")
        }
        
        didSet{
            print("did set " + newAge!)
        }
    }
    
    
    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }
    
    func testExample() {
        // This is an example of a functional test case.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
        
        // 这里c都没有获取到新的 值
        c = 4
        print("\(c)--- \(a)")
        
        self.c = 5
        print("\(c)--- \(a)")
    
        tittle = "Hello World"
        print("title is \(tittle!)")
        
      //   会报错  Cannot assign to property: 'age' is a get-only property
//        age = 50
//        print("age is \(age!)")
        
        //
        self.ddd = 5
        print("\(ddd)--- \(num)")
        
        //  整个的数组
//        print("\(ccc)")
        //
        self.ddd = 10
        print("\(ddd)--- \(num)")
        
    }
    
    
    
    
    func testPerformanceExample() {
        // This is an example of a performance test case.
        self.measure {
            // Put the code you want to measure the time of here.
        }
    }
    
}
